package br.com.site;

import java.util.ArrayList;
import java.util.List;

import model.Equipe;
import model.Estrutura;
import model.PDI;
import model.Perigo;
import model.Vitima;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;

public class NovoVitima extends Activity{

	private List<Estrutura> listaEstruturas;
	private List<Equipe> listaEquipes;
	private List<Perigo> listaPerigos;
	
	private TableLayout tlVitimaDelete;
	
	private EditText etVitimaIdentificacao, etVitimaNumPosVit, etVitimaQtdVivos, etVitimaQtdMortos, etVitimaQtdVivosResgatados, etVitimaQtdMortosRemov;
	private Spinner spVitimaEstrut, spVitimaTeam, spVitimaPerigo;
	private ImageButton salvar;
	private TextView tvTit;
	
	private ArrayAdapter<CharSequence> adtVitimaEstrut, adtVitimaTeam, adtVitimaPerigo;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.novo_vitima);
		
		carregaViews();
		
		setPDIArrayAdapter(adtVitimaEstrut, spVitimaEstrut, listaEstruturas);
    	setPDIArrayAdapter(adtVitimaTeam, spVitimaTeam, listaEquipes);
    	setPDIArrayAdapter(adtVitimaPerigo, spVitimaPerigo, listaPerigos);
        
    	if(!Global.editarPDI) novoPDI();
        else editarPDI();
        
	}
	
	private void carregaViews(){
		listaEstruturas = br.com.site.MainActivity.listaEstruturas;
		listaEquipes = br.com.site.MainActivity.listaEquipes;
		listaPerigos = br.com.site.MainActivity.listaPerigos;
		
		tlVitimaDelete = (TableLayout) findViewById(R.novo_vitima.tlVitDelete);
		tlVitimaDelete.setVisibility(View.GONE);
		
		etVitimaIdentificacao = (EditText) findViewById(R.novo_vitima.etVitimaIdentificacao);
		etVitimaNumPosVit = (EditText) findViewById(R.novo_vitima.etVitimaNumPosVit);
		etVitimaQtdVivos = (EditText) findViewById(R.novo_vitima.etVitimaQtdVivos);
		etVitimaQtdMortos = (EditText) findViewById(R.novo_vitima.etVitimaQtdMortos);
		etVitimaQtdVivosResgatados = (EditText) findViewById(R.novo_vitima.etVitimaQtdVivosResgatados);
		etVitimaQtdMortosRemov = (EditText) findViewById(R.novo_vitima.etVitimaQtdMortosRemov);
    	
		spVitimaEstrut = (Spinner) findViewById(R.novo_vitima.spVitimaEstrut);
		spVitimaTeam = (Spinner) findViewById(R.novo_vitima.spVitimaTeam);
		spVitimaPerigo = (Spinner) findViewById(R.novo_vitima.spVitimaPerigo);
    	
		salvar = (ImageButton) findViewById(R.novo_vitima.vitimaSalvar);
		tvTit = (TextView) findViewById(R.novo_vitima.tvVitTit);
		
		
		adtVitimaEstrut = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
    	adtVitimaEstrut.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	
    	adtVitimaTeam = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtVitimaTeam.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adtVitimaPerigo = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtVitimaPerigo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		
	}

	/**
	 * Este método aplicará a um spinner um ArrayAdapter populado pelos toStrings de cada PDI contido numa lista de PDIs
	 * @param aAdapter ArrayAdapter que será aplicado no Spinner
	 * @param sp Spinner que receberá os toStrings dos PDIs
	 * @param l Lista de PDIs a serem adicionados ao ArrayAdapter
	 */
	private void setPDIArrayAdapter(ArrayAdapter<CharSequence> aAdapter, Spinner sp, List<?> l){
		aAdapter = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
		aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
		sp.setAdapter(aAdapter);
        if(l.size() < 1){
        	aAdapter.add("Desconhecido");
        }else{
        	aAdapter.add("Desconhecido");
	        for (int j = 0; j < l.size(); j++) {
	        	aAdapter.add(l.get(j).toString());
			}
    	}
	}
	
	private void novoPDI(){
		salvar.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				salvar.setImageResource(R.drawable.bt_aplicar);
				GeoPoint temp = new GeoPoint(0, 0);
				String identif = etVitimaIdentificacao.getText().toString();
				String textoBalao = "";
				
				int numPosVit = -1;
				try{
					 numPosVit = Integer.parseInt(etVitimaNumPosVit.getText().toString());
					 textoBalao += "Possíveis vítimas: " + numPosVit;
				}catch(NumberFormatException nfe){
					numPosVit = -1;
				}
				
				int qtdVivos = -1;
				try{
					 qtdVivos = Integer.parseInt(etVitimaQtdVivos.getText().toString());
					 textoBalao += ", Vivos confirmados: " + qtdVivos;
				}catch(NumberFormatException nfe){
					qtdVivos = -1;
				}
				
				int qtdMortos = -1;
				try{
					 qtdMortos = Integer.parseInt(etVitimaQtdMortos.getText().toString());
				}catch(NumberFormatException nfe){
					qtdMortos = -1;
				}
				
				int qtdVivosResg = -1;
				try{
					qtdVivosResg = Integer.parseInt(etVitimaQtdVivosResgatados.getText().toString());
				}catch(NumberFormatException nfe){
					qtdVivosResg = -1;
				}
				
				int qtdMortosRemov = -1;
				try{
					qtdMortosRemov = Integer.parseInt(etVitimaQtdMortosRemov.getText().toString());
				}catch(NumberFormatException nfe){
					qtdMortosRemov = -1;
				}
								
				Estrutura vitimaEstrut = null;
				for (Estrutura e : listaEstruturas) {
					if (spVitimaEstrut.getSelectedItem().equals(e.toString())){
						vitimaEstrut = e;
					}else{
						continue;
					}
				}
				
				Equipe vitimaTeam = null;
				for (Equipe e : listaEquipes) {
					if (spVitimaTeam.getSelectedItem().equals(e.toString())){
						vitimaTeam = e;
					}else{
						continue;
					}
				}
				
				Perigo vitimaPerigo = null;
				for (Perigo p : listaPerigos) {
					if (spVitimaPerigo.getSelectedItem().equals(p.toString())){
						vitimaPerigo = p;
					}else{
						continue;
					}
				}
				
				if (vitimaEstrut != null) textoBalao += "\nEstrutura: " + vitimaEstrut.toString();
				if (vitimaTeam != null) textoBalao += "\nEquipe: " + vitimaTeam.toString();
				
				Vitima vit = new Vitima(temp,
						identif, textoBalao,
						vitimaEstrut, vitimaTeam, vitimaPerigo,
						identif, numPosVit, qtdVivos, qtdMortos, qtdVivosResg, qtdMortosRemov);
				
				if(vitimaEstrut != null) vitimaEstrut.setVitima(vit);
				if(vitimaPerigo != null) vitimaPerigo.setVitima(vit);
				
				br.com.site.MainActivity.objetoPassado = vit;
				Global.novoPdi = true;
				finish();
				br.com.site.MainActivity.exibeToast(getApplicationContext(), "Toque na tela para posicionar a vítima.");
			}
		});
	}
	
	private void editarPDI(){
		salvar.setImageResource(R.drawable.bt_edit);
    	tvTit.setText("Editar Vítima");
    	tlVitimaDelete.setVisibility(View.VISIBLE);
    	
    	final TextView tvDel = (TextView) findViewById(R.novo_vitima.tvDelVit);
    	final ImageView ivDel = (ImageView) findViewById(R.novo_vitima.ivDelVit);
    	
    	final Vitima v = (Vitima) Global.pdiEdicao;
    	
    	tvDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(v);
			}
		});
    	
    	ivDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(v);
			}
		});

    	etVitimaIdentificacao.setText(v.getIdentificacao());
    	
    	setNumEditText(v.getNumeroPossiveisVitimas(),etVitimaNumPosVit);
    	setNumEditText(v.getQtdVivos(),etVitimaQtdVivos);
    	setNumEditText(v.getQtdMortos(),etVitimaQtdMortos);
    	setNumEditText(v.getQtdVivosResgatados(),etVitimaQtdVivosResgatados);
    	setNumEditText(v.getQtdMortosRemovidos(),etVitimaQtdMortosRemov);
    	
    	try{
    		setAdapterPositionFromString(spVitimaEstrut,v.getEstrutura().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spVitimaEstrut, "Desconhecido");
		}
    	try{
    		setAdapterPositionFromString(spVitimaTeam,v.getEquipe().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spVitimaTeam, "Desconhecido");
		}
    	try{
    		setAdapterPositionFromString(spVitimaPerigo,v.getPerigo().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spVitimaPerigo, "Desconhecido");
		}
    	
    	salvar.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View view) {
				MainActivity.listaVitimas.remove(v);
				
				String textoBalao = "";
				
				v.setIdentificacao(setStringEditText(etVitimaIdentificacao));
				
				int numPosVit = -1;
				try{
					 numPosVit = Integer.parseInt(etVitimaNumPosVit.getText().toString());
					 textoBalao += "Possíveis vítimas: " + numPosVit;
				}catch(NumberFormatException nfe){}
				v.setNumeroPossiveisVitimas(numPosVit);
				
				int qtdVivos = -1;
				try{
					 qtdVivos = Integer.parseInt(etVitimaQtdVivos.getText().toString());
					 textoBalao += "  Vivos confirmados: " + qtdVivos;
				}catch(NumberFormatException nfe){}
				v.setQtdVivos(qtdVivos);
				
				int qtdMortos = -1;
				try{
					 qtdMortos = Integer.parseInt(etVitimaQtdMortos.getText().toString());
				}catch(NumberFormatException nfe){}
				v.setQtdMortos(qtdMortos);
				
				int qtdVivosResg = -1;
				try{
					qtdVivosResg = Integer.parseInt(etVitimaQtdVivosResgatados.getText().toString());
				}catch(NumberFormatException nfe){}
				v.setQtdVivosResgatados(qtdVivosResg);
				
				int qtdMortosRemov = -1;
				try{
					qtdMortosRemov = Integer.parseInt(etVitimaQtdMortosRemov.getText().toString());
				}catch(NumberFormatException nfe){}
				v.setQtdMortosRemovidos(qtdMortosRemov);
								
				Estrutura vitimaEstrut = null;
				for (Estrutura e : listaEstruturas) {
					if (spVitimaEstrut.getSelectedItem().equals(e.toString())){
						vitimaEstrut = e;
					}else{
						continue;
					}
				}
				
				Equipe vitimaTeam = null;
				for (Equipe e : listaEquipes) {
					if (spVitimaTeam.getSelectedItem().equals(e.toString())){
						vitimaTeam = e;
					}else{
						continue;
					}
				}
				
				Perigo vitimaPerigo = null;
				for (Perigo p : listaPerigos) {
					if (spVitimaPerigo.getSelectedItem().equals(p.toString())){
						vitimaPerigo = p;
					}else{
						continue;
					}
				}
				
				if (vitimaEstrut != null){
					textoBalao += "\nEstrutura: " + vitimaEstrut.toString();
					v.setEstrutura(vitimaEstrut);
				}
				if (vitimaTeam != null){
					textoBalao += "\nEquipe: " + vitimaTeam.toString();
					v.setEquipe(vitimaTeam);
				}
				if(vitimaPerigo != null) v.setPerigo(vitimaPerigo);
				v.setTextoBalao(textoBalao);
				
				
				try{
					vitimaEstrut.setVitima(v);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}try{
					vitimaPerigo.setVitima(v);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
				
				atualizaObj(v);
            	finish();
    			Global.editarPDI=false;
    			MainActivity.exibeToast(getApplicationContext(), "Dados atualizados");
			}
		});
	}
	
	public void setAdapterPositionFromString(Spinner spinner, String texto){
		@SuppressWarnings({ "unchecked", "rawtypes" })
		ArrayAdapter<CharSequence> adapter = (ArrayAdapter) spinner.getAdapter();
		try{
			int pos = adapter.getPosition(texto);
			spinner.setSelection(pos);
		}catch(NullPointerException exc){
			spinner.setSelection(0);
		}
	}

	public static void atualizaObj(Vitima vit){
		MainActivity.vitimaOverlays.clear();
		for (Vitima v : MainActivity.listaVitimas) {
			if(!v.equals(vit)){
				MainActivity.vitimaOverlays.addOverlay(v.getOverlayItem(), v);
			}
		}
		MainActivity.vitimaOverlays.addOverlay(vit.getOverlayItem(), vit);
		MainActivity.listaVitimas.add(vit);
		MainActivity.vitimaOverlays.hideBalloon();
	}
	
	public void deletaObj(final Vitima vi){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Excluir Vítima")
			   .setMessage("Tem certeza?")
		       .setCancelable(false)
		       .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	   ArrayList<PDI> links = Global.getArrayDeLinks(vi);
		        	   if(!links.equals(null) && links.size()>0){
		        		   for (PDI pdi : links) {
		        			   if(pdi instanceof Estrutura){
		        				   Estrutura es = (Estrutura) pdi;
		        				   es.setVitima(null);
		        				   es.atualizaTextoBalao();
		        				   NovoEstrutura.atualizaObj(es);
		        			   }
		        			   if(pdi instanceof Perigo){
		        				   Perigo p = (Perigo) pdi;
		        				   p.setVitima(null);
		        				   p.atualizaTextoBalao();
		        				   NovoPerigo.atualizaObj(p);
		        			   }
		        		   }
		        	   }
		        	   MainActivity.vitimaOverlays.clear();
		        	   MainActivity.listaVitimas.remove(vi);
		        	   for (Vitima v : MainActivity.listaVitimas) {
		        		   MainActivity.vitimaOverlays.addOverlay(v.getOverlayItem(), v);
		        	   }
		        	   MainActivity.vitimaOverlays.hideBalloon();
		        	   finish();
		        	   Global.editarPDI=false;
		           }
		       })
		       .setNegativeButton("Não", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       });
		builder.show();
	}
	
	public void setNumEditText(int propriedade, EditText et){
		String s = "";
    	if(propriedade >= 0) s = String.valueOf(propriedade);
    	et.setText(s);
	}
	
	public String setStringEditText(EditText et){
		if (et.getText().toString().equals("")) return "Desconhecido";
		return et.getText().toString();
	}
	
	@Override
	public void onBackPressed() {
		Global.editarPDI=false;
		super.onBackPressed();
	}
}
